git flow migration step 2 recommendation

written by Chat GPT 5

[스텝 2] 자동화 고도화(라벨 감지 → 승급 PR 자동 생성, 스테이징 배포)

1) dev 기능 분류 자동화(라벨 기반)

2) 승급 PR 자동 생성 워크플로

충돌 시 exit 10로 실패 → 수동 승급(아래 2-2로 전환)

2-2) 라벨 미부착·자동 실패 시 수동 승급

3) 스테이징 환경 배포 자동화

4) stage → main 머지, 태그, 배포(동일)

5) main → dev 백머지(이번 스텝2는 수동 PR)


부가: 운영 규칙 요약(변경·추가)

2025-09-25 Backmerge-on-tag

name: Back-merge to stage & dev on release tag

on:
  push:
    tags:
      - "v*.*.*"   # 세머버 태그만 트리거

permissions:
  contents: write
  pull-requests: write

jobs:
  backmerge:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target: ["stage", "dev"]
    steps:
      - name: Extract tag & basic info
        id: meta
        run: |
          TAG="${GITHUB_REF#refs/tags/}"
          echo "tag=${TAG}" >> $GITHUB_OUTPUT

      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }

      - name: Fetch all branches & tags
        run: |
          git fetch --all --tags

      - name: Verify tag commit belongs to main
        id: verify
        run: |
          TAG_SHA="$(git rev-list -n 1 "${{ steps.meta.outputs.tag }}")"
          if git merge-base --is-ancestor "$TAG_SHA" origin/main; then
            echo "sha=${TAG_SHA}" >> $GITHUB_OUTPUT
          else
            echo "::error::Tag commit is not on origin/main. Aborting."
            exit 1
          fi

      - name: Prepare backmerge branch
        id: prep
        run: |
          TARGET="${{ matrix.target }}"
          TAG="${{ steps.meta.outputs.tag }}"
          BR="chore/backmerge-${TARGET}-${TAG}"

          # idempotency
          git push origin --delete "$BR" 2>/dev/null || true
          git branch -D "$BR" 2>/dev/null || true

          git fetch origin "$TARGET"
          git switch -c "$BR" "origin/${TARGET}"

          # merge tag into target tip
          set -e
          git merge --no-ff --no-edit "${TAG}" || {
            echo "::error::Merge conflict when merging ${TAG} into ${TARGET}. Resolve manually."
            exit 1
          }

          # skip if no changes
          if git diff --quiet "origin/${TARGET}...HEAD"; then
            echo "skip=true" >> $GITHUB_OUTPUT
          else
            echo "skip=false" >> $GITHUB_OUTPUT
            git push -u origin "$BR"
          fi

      - name: Open PR to target branch
        if: steps.prep.outputs.skip == 'false'
        id: cpr
        uses: peter-evans/create-pull-request@v6
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          base: ${{ matrix.target }}
          branch: chore/backmerge-${{ matrix.target }}-${{ steps.meta.outputs.tag }}
          title: "chore(backmerge): main → ${{ matrix.target }} @ ${{ steps.meta.outputs.tag }}"
          body: |
            Automated back-merge of release **${{ steps.meta.outputs.tag }}** into **${{ matrix.target }}**.

            - Source: main @ tag `${{ steps.meta.outputs.tag }}`
            - Target: `${{ matrix.target }}`
            - Strategy: `git merge --no-ff ${{ steps.meta.outputs.tag }}`
            - Auto-merge: enabled (squash) once required checks pass.
          labels: |
            backmerge
            automerge
          draft: false

      # ✅ Auto-merge 활성화 (CI green 시 자동으로 머지됨)
      - name: Enable auto-merge (squash)
        if: steps.prep.outputs.skip == 'false'
        uses: peter-evans/enable-pull-request-automerge@v3
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          pull-request-number: ${{ steps.cpr.outputs.pull-request-number }}
          merge-method: squash

      - name: No-op note
        if: steps.prep.outputs.skip == 'true'
        run: echo "No diff for ${{ matrix.target }}; PR skipped."

목적: 프로덕션 릴리즈(main)를 하위 환경에 동기화

동작 조건:

동작 방식:

  1. 태그 커밋이 main 브랜치에 속하는지 검증
  2. Stage와 Dev 각각에 대해 병렬로:
    • 백머지 브랜치 생성 (chore/backmerge-{target}-{tag})
    • 태그를 타겟 브랜치로 merge (--no-ff)
    • 변경사항이 있으면 PR 생성
    • 자동 머지 활성화 (squash merge)

특징: